From: Matthieu Gallien Date: Mon, 3 Mar 2025 14:24:21 +0000 (+0100) Subject: when deleting a remote locked file, provide needed lock headers X-Git-Tag: archive/raspbian/3.16.7-1_deb13u1+rpi1~1^2~12^2~2^2~14^2 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success/%22http:/www.example.com/cgi/success?a=commitdiff_plain;h=2c58577b87636e4fe90ceb5155dc546f95cc3b00;p=nextcloud-desktop.git when deleting a remote locked file, provide needed lock headers Signed-off-by: Matthieu Gallien --- diff --git a/src/libsync/basepropagateremotedeleteencrypted.cpp b/src/libsync/basepropagateremotedeleteencrypted.cpp index 4baf8fa8c..05c0ad9ed 100644 --- a/src/libsync/basepropagateremotedeleteencrypted.cpp +++ b/src/libsync/basepropagateremotedeleteencrypted.cpp @@ -153,7 +153,7 @@ void BasePropagateRemoteDeleteEncrypted::deleteRemoteItem(const QString &filenam { qCInfo(ABSTRACT_PROPAGATE_REMOVE_ENCRYPTED) << "Deleting nested encrypted item" << filename; - const auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this); + const auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), {}, this); if (_encryptedFolderMetadataHandler && _encryptedFolderMetadataHandler->folderMetadata() && _encryptedFolderMetadataHandler->folderMetadata()->isValid()) { deleteJob->setFolderToken(_encryptedFolderMetadataHandler->folderToken()); diff --git a/src/libsync/deletejob.cpp b/src/libsync/deletejob.cpp index 83666ba9f..f81c83c87 100644 --- a/src/libsync/deletejob.cpp +++ b/src/libsync/deletejob.cpp @@ -20,13 +20,15 @@ namespace OCC { Q_LOGGING_CATEGORY(lcDeleteJob, "nextcloud.sync.networkjob.delete", QtInfoMsg) -DeleteJob::DeleteJob(AccountPtr account, const QString &path, QObject *parent) +DeleteJob::DeleteJob(AccountPtr account, const QString &path, const QMap &headers, QObject *parent) : SimpleFileJob(account, path, parent) + , _headers(headers) { } -DeleteJob::DeleteJob(AccountPtr account, const QUrl &url, QObject *parent) +DeleteJob::DeleteJob(AccountPtr account, const QUrl &url, const QMap &headers, QObject *parent) : SimpleFileJob(account, QString(), parent) + , _headers(headers) , _url(url) { } @@ -38,6 +40,10 @@ void DeleteJob::start() req.setRawHeader("e2e-token", _folderToken); } + for (auto oneHeaderIt = _headers.begin(); oneHeaderIt != _headers.end(); ++oneHeaderIt) { + req.setRawHeader(oneHeaderIt.key(), oneHeaderIt.value()); + } + if (_url.isValid()) { startRequest("DELETE", _url, req); } else { diff --git a/src/libsync/deletejob.h b/src/libsync/deletejob.h index 4bc6351e5..d244e5a85 100644 --- a/src/libsync/deletejob.h +++ b/src/libsync/deletejob.h @@ -27,8 +27,8 @@ class DeleteJob : public SimpleFileJob { Q_OBJECT public: - explicit DeleteJob(AccountPtr account, const QString &path, QObject *parent = nullptr); - explicit DeleteJob(AccountPtr account, const QUrl &url, QObject *parent = nullptr); + explicit DeleteJob(AccountPtr account, const QString &path, const QMap &headers = {}, QObject *parent = nullptr); + explicit DeleteJob(AccountPtr account, const QUrl &url, const QMap &headers = {}, QObject *parent = nullptr); void start() override; @@ -36,6 +36,7 @@ public: void setFolderToken(const QByteArray &folderToken); private: + QMap _headers = {}; QUrl _url; // Only used if the constructor taking a url is taken. QByteArray _folderToken; }; diff --git a/src/libsync/propagateremotedelete.cpp b/src/libsync/propagateremotedelete.cpp index 708b0f2ed..b37636607 100644 --- a/src/libsync/propagateremotedelete.cpp +++ b/src/libsync/propagateremotedelete.cpp @@ -71,7 +71,11 @@ void PropagateRemoteDelete::createDeleteJob(const QString &filename) qCInfo(lcPropagateRemoteDelete) << "Deleting file, local" << _item->_file << "remote" << remoteFilename; - _job = new DeleteJob(propagator()->account(), propagator()->fullRemotePath(remoteFilename), this); + auto headers = QMap{}; + if (_item->_locked == SyncFileItem::LockStatus::LockedItem) { + headers[QByteArrayLiteral("If")] = (QLatin1String("<") + propagator()->account()->davUrl().toString() + _item->_file + "> (_lockToken.toUtf8() + ">)").toUtf8(); + } + _job = new DeleteJob(propagator()->account(), propagator()->fullRemotePath(remoteFilename), headers, this); connect(_job.data(), &DeleteJob::finishedSignal, this, &PropagateRemoteDelete::slotDeleteJobFinished); propagator()->_activeJobList.append(this); _job->start(); diff --git a/src/libsync/propagateremotedeleteencryptedrootfolder.cpp b/src/libsync/propagateremotedeleteencryptedrootfolder.cpp index 849e5f2b2..55dd4910f 100644 --- a/src/libsync/propagateremotedeleteencryptedrootfolder.cpp +++ b/src/libsync/propagateremotedeleteencryptedrootfolder.cpp @@ -181,7 +181,7 @@ void PropagateRemoteDeleteEncryptedRootFolder::deleteNestedRemoteItem(const QStr { qCInfo(PROPAGATE_REMOVE_ENCRYPTED_ROOTFOLDER) << "Deleting nested encrypted remote item" << filename; - auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), this); + auto deleteJob = new DeleteJob(_propagator->account(), _propagator->fullRemotePath(filename), {}, this); deleteJob->setFolderToken(folderToken()); deleteJob->setProperty(encryptedFileNamePropertyKey, filename); diff --git a/src/libsync/propagateremotemkdir.cpp b/src/libsync/propagateremotemkdir.cpp index 868614e68..f39f39188 100644 --- a/src/libsync/propagateremotemkdir.cpp +++ b/src/libsync/propagateremotemkdir.cpp @@ -59,8 +59,9 @@ void PropagateRemoteMkdir::start() } _job = new DeleteJob(propagator()->account(), - propagator()->fullRemotePath(_item->_file), - this); + propagator()->fullRemotePath(_item->_file), + {}, + this); connect(qobject_cast(_job), &DeleteJob::finishedSignal, this, &PropagateRemoteMkdir::slotMkdir); _job->start(); } diff --git a/src/libsync/propagateupload.cpp b/src/libsync/propagateupload.cpp index 92dd47b54..a38359d94 100644 --- a/src/libsync/propagateupload.cpp +++ b/src/libsync/propagateupload.cpp @@ -297,8 +297,9 @@ void PropagateUploadFileCommon::startUploadFile() { qDebug() << "Deleting the current"; auto job = new DeleteJob(propagator()->account(), - propagator()->fullRemotePath(_fileToUpload._file), - this); + propagator()->fullRemotePath(_fileToUpload._file), + {}, + this); _jobs.append(job); connect(job, &DeleteJob::finishedSignal, this, &PropagateUploadFileCommon::slotComputeContentChecksum); connect(job, &QObject::destroyed, this, &PropagateUploadFileCommon::slotJobDestroyed); diff --git a/src/libsync/propagateuploadng.cpp b/src/libsync/propagateuploadng.cpp index be5cd5995..7444d4318 100644 --- a/src/libsync/propagateuploadng.cpp +++ b/src/libsync/propagateuploadng.cpp @@ -121,7 +121,7 @@ void PropagateUploadFileNG::doStartUpload() // The upload info is stale. remove the stale chunks on the server _transferId = progressInfo._transferid; // Fire and forget. Any error will be ignored. - (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), this))->start(); + (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), {}, this))->start(); // startNewUpload will reset the _transferId and the UploadInfo in the db. } @@ -168,7 +168,7 @@ void PropagateUploadFileNG::slotPropfindFinished() // Wipe the old chunking data. // Fire and forget. Any error will be ignored. - (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), this))->start(); + (new DeleteJob(propagator()->account(), chunkUploadFolderUrl(), {}, this))->start(); propagator()->_activeJobList.append(this); startNewUpload(); @@ -186,7 +186,7 @@ void PropagateUploadFileNG::slotPropfindFinished() // we should remove the later chunks. Otherwise when we do dynamic chunk sizing, we may end up // with corruptions if there are too many chunks, or if we abort and there are still stale chunks. for (const auto &serverChunk : std::as_const(_serverChunks)) { - auto job = new DeleteJob(propagator()->account(), Utility::concatUrlPath(chunkUploadFolderUrl(), serverChunk.originalName), this); + auto job = new DeleteJob(propagator()->account(), Utility::concatUrlPath(chunkUploadFolderUrl(), serverChunk.originalName), {}, this); QObject::connect(job, &DeleteJob::finishedSignal, this, &PropagateUploadFileNG::slotDeleteJobFinished); _jobs.append(job); job->start(); diff --git a/src/libsync/syncengine.cpp b/src/libsync/syncengine.cpp index 550197173..24c86a73b 100644 --- a/src/libsync/syncengine.cpp +++ b/src/libsync/syncengine.cpp @@ -254,7 +254,7 @@ void SyncEngine::deleteStaleUploadInfos(const SyncFileItemVector &syncItems) if (!transferId) continue; // Was not a chunked upload QUrl url = Utility::concatUrlPath(account()->url(), QLatin1String("remote.php/dav/uploads/") + account()->davUser() + QLatin1Char('/') + QString::number(transferId)); - (new DeleteJob(account(), url, this))->start(); + (new DeleteJob(account(), url, {}, this))->start(); } } }